package com.qf.test.test;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.subject.Subject;

/**
 * 测试shiro框架的基本使用
 */
public class ShiroDemo {
    public static void main(String[] args) {
        //1.获取SecurityManager核心对象
        DefaultSecurityManager securityManager = new DefaultSecurityManager();

        //2.获取配置文件中的权限数据 角色数据
        IniRealm iniRealm = new IniRealm("classpath:shiro.ini");
        //3.将用户  角色，权限放入secruitManager核心对象中
        securityManager.setRealm(iniRealm);
        //4.设置SecuritManagerUtils核心工具类
        SecurityUtils.setSecurityManager(securityManager);
        //5.得到Subject当前登录用户对象
        Subject subject = SecurityUtils.getSubject();
        //6.登录 封装AuthrnticationTnken对象 模拟用户在页面输入用户名和 密码
        UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "123456");
        //7.调用login登录方法 让shairo框架核心SecurityManager对象去验证用户输入的用户名密码是否正确// 、
        try {
            //用户输入的用户名密码在这里检验
            subject.login(token);
            System.out.println("用户登录成功");

            //8.如果用户名密码不对 抛出相应的异常
        } catch (UnknownAccountException e) {
            System.out.println("用户名不正确");
        } catch (IncorrectCredentialsException e) {
            System.out.println("密码不正确");

        } catch (AuthenticationException e) {
            e.printStackTrace();
            System.out.println("其他未知 的异常");
        }


        //9.如果用户名 密码正确 获取 用户，角色，权限等框架中能够获取到用户信息打印登录成功
        System.out.println("==============登录后判断用户的角色====================");
        System.out.println("判断该用户是否为管理员"+subject.hasRole("admin"));
        System.out.println("判断该用户 是否为开发者"+subject.hasRole("developper"));
        System.out.println("判断该用户是否为xxx角色"+subject.hasRole("xxx"));
        System.out.println("登录后判断用户的权限=============  父模块 子模块的操作");
        System.out.println("判断当前用户是否有添加权限操作"+subject.isPermitted("sys:user:add"));
        System.out.println("判断当前用用户是否有删除操作"+subject.isPermitted("sys:user:del"));
        System.out.println("判断用户是否有添加菜单操作"+subject.isPermitted("sys:menu:add"));
        System.out.println("判断用户是否有删除菜单操作"+subject.isPermitted("sys:meun:add"));
    }

}